package cn.hh.ymcc.web.controller;

import cn.hh.ymcc.domain.PayOrder;
import cn.hh.ymcc.dto.AlipayNotifyDto;
import cn.hh.ymcc.dto.ApplyPayDto;
import cn.hh.ymcc.result.JSONResult;
import cn.hh.ymcc.service.IPayOrderService;
import cn.hh.ymcc.service.IPayService;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.mapper.Wrapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
@Slf4j
@RestController
@RequestMapping("/pay")
public class payController {

    @Autowired
    private IPayOrderService payOrderService;

    @Autowired
    private IPayService payService;

    /**
     *  检查支付订单是否存在
     *  true 存在  / false 不存在
     */
    @GetMapping("/checkPayOrder/{orderNo}")
    public JSONResult checkPayOrder(@PathVariable("orderNo") String orderNo){
        Wrapper<PayOrder> wrapper = new EntityWrapper<>();
        wrapper.eq("order_no",orderNo); // select * from PayOrder WHERE (order_no = 2548891382)
                                                // MPGENVAL1 -> 2548891382
        PayOrder payOrder = payOrderService.selectOne(wrapper);
        return payOrder != null ? JSONResult.success() : JSONResult.error("支付单号不存在!");
    }


    /**
     *  发起支付
     * @param dto
     * @return
     */
    @PostMapping("/apply")
    public JSONResult apply(@RequestBody ApplyPayDto dto){
        String payResponse =  payService.apply(dto);
        return JSONResult.success(payResponse);
    }

    /**
     * 支付宝支付异步回调通知接口
     * @param dto
     *  SpringMvc会从请求头(地址栏)里把参数拿出来包装为一个对象, 如果参数是在请求体里面,才用@RequestBody
     *  return 如果底层业务处理完成,返回:success 字符串给支付宝
     *         如果返回的不是success,那么支付宝还会再次通知你,直到8次你都没有响应success,支付宝就放弃通知
     *         支付宝会最大努力通知notify接口: notify接口是外网能够访问的接口  只有项目在本地的时候才会用到内网穿透技术
     */
    @RequestMapping("/alipay/notify") // 不知道支付宝调接口用什么请求方式,用@RequestMapping自动匹配
    public String notify(AlipayNotifyDto dto){
        try {
            log.info("支付宝异步回调了啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊!!!!");
            payService.notify(dto);
            return "success";
        } catch (Exception e) {
           e.printStackTrace();
            return "NO"; // 返回No,支付宝还会通知支付结果
        }
    }


}
